/*
 * @Author: zengwj
 * @Date: 2022-08-09 10:35:29
 * @LastEditors: zengwj
 * @LastEditTime: 2022-08-09 16:14:34
 * @Description:
 */

import Dep from './dep.js'
import observe from './observe.js'

// 为obj.key 设置getter setter 拦截
export default function defineReactive(obj, key, val) {
	//递归observe, 设置__ob__ 原型
	const childOb = observe(val)
	const dep = new Dep()
	Object.defineProperty(obj, key, {
		get() {
			// dep.target 不为空 进行依赖收集
			if (Dep.target) {
				dep.depend()
				//如果存在子ob  顺道一块收集
				if (childOb) {
					childOb.dep.depend()
				}
			}
			console.log(`getter: key = ${key}`)
			return val
		},
		set(newV) {
			console.log(`setter: ${key} = ${newV}`)
			if (newV === val) return
			val = newV
			// 对新值进行响应式处理，这里针对的是新值为非原始值的情况，比如 val 为对象、数组
			observe(val)
			//通知 依赖更新
			dep.notify()
		},
	})
}
